package com.simpou.commons.utils.exception;

import com.simpou.commons.utils.exception.model.RuleViolation;
import com.simpou.commons.utils.lang.ArrayIterator;
import com.simpou.commons.utils.validation.Assertions;

import lombok.Getter;

import java.util.Iterator;


/**
 * Unificador das exceções de negócio.
 *
 * @author Jonas Pereira
 * @since 2012-10-30
 * @version 2013-05-31
 */
class BusinessExceptionDelegate implements BusinessException {
    /**
     * Tipo da exceção, tipo da regra de negócio violada ou descrição da
     * condição gerada pelo sistema dada uma entrada que não foi considerada
     * consistente.
     */
    @Getter
    private final RuleViolation[] types;

    /**
     * @param types Tipos de exceções de negócio, regras violadas ou descrição
     * das condições geradas pelo sistema dada uma entrada que não foi
     * considerada consistente. Deve ser não vazio.
     */
    BusinessExceptionDelegate(final RuleViolation[] types) {
        this.types = Assertions.notEmpty(RuleViolation.class, types).clone();
    }

    /**
     * @param types Tipos.
     * @return Tipos separados por vírgulo.
     */
    static String getMessage(final RuleViolation[] types) {
        final StringBuilder message = new StringBuilder();

        for (RuleViolation type : types) {
            message.append(type.getMsg()).append(", ");
        }

        return message.substring(0, message.length() - 2);
    }

    /**
     * @return Primeira ou única violação.
     */
    public final RuleViolation getType() {
        return types[0];
    }

    @Override
    public Iterator<RuleViolation> iterator() {
        return new ArrayIterator<RuleViolation>(types);
    }
}
